﻿using PersistenceLayer.DAL;
using PersistenceLayer.Model;
using SupportLayer.Constantes.OUTROS;
using SupportLayer.Constantes.PRODUTO;
using SupportLayer.Enums;
using SupportLayer.Objetos.Produto;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Util;
using Util.ExtensionMethods;

namespace ByBikeShop.Administracao.Pages
{
	public partial class Produtos : BaseAdmin
	{
		string FILTER_NORMAL = "normal";
		string FILTER_CODPROD = "codprod";
		private int GetPagina
		{
			get
			{
				if (Request.QueryString[OUTROS.PAGINA] == null)
					return 1;

				int page = 0;

				Int32.TryParse(Request.QueryString[OUTROS.PAGINA].ToString(), out page);

				if (page > 0)
					return page;

				return 1;
			}
		}
		private string GetFilter
		{
			get
			{
				if (Request.QueryString[OUTROS.FILTRO] == null)
					return "";
				return Request.QueryString[OUTROS.FILTRO].ToString();
			}
		}
		private Ordenacao GetOrdenacao
		{
			get
			{
				try
				{
					if (Request.QueryString[OUTROS.ORDENACAO] == null)
						return Ordenacao.Newest;

					return (Ordenacao)(Convert.ToInt32(Request.QueryString[OUTROS.ORDENACAO].ToString()));
				}
				catch (Exception)
				{
					return Ordenacao.Newest;
				}
			}
		}
		private int GetNumeroPaginas
		{
			get
			{
				if ((hdfNumeroPaginas.Value == null) || (Convert.ToInt32(hdfNumeroPaginas.Value) <= 0))
					return 0;

				return Convert.ToInt32(hdfNumeroPaginas.Value);
			}
		}
		private string GetFilterType
		{
			get
			{
				if ((Request.QueryString["filtertype"] == null) || (Request.QueryString["filtertype"].ToString() == ""))
					return FILTER_NORMAL;
				else
					return Request.QueryString["filtertype"].ToString();
			}
		}

		protected void Page_Load(object sender, EventArgs e)
		{
			base.PageLoad(hasGrid: true);
		}

		public override void CarregaDados()
		{
		}

		public override void CarregaGrid()
		{
			grdProdutos.AutoGenerateColumns = false;
			grdProdutos.Columns.Clear();

			grdProdutos.Columns.Add(Gridview.GeraBoundField(PRODUTO.ID, ""));
			grdProdutos.Columns.Add(Gridview.GeraBoundField(MARCA.DESCRICAO, "Marca", 200));
			grdProdutos.Columns.Add(Gridview.GeraBoundField(PRODUTO.CATEGORIA_ID, "Categoria", 200));
			grdProdutos.Columns.Add(Gridview.GeraBoundField(PRODUTO.MODELO, "Modelo", 300));
			grdProdutos.Columns.Add(Gridview.GeraBoundField(PRODUTO.PRECO, "Preço", 150));
			grdProdutos.Columns.Add(Gridview.GeraBoundField(FOTOS.ID, "Qtd. Fotos", 150));
			grdProdutos.Columns.Add(Gridview.GeraButtonField(ButtonType.Image, "", "editar", ResolveUrl("/Imagens/Icones/edit.svg"), 40));
			grdProdutos.Columns.Add(Gridview.GeraButtonField(ButtonType.Image, "", "deletar", ResolveUrl("/Imagens/Icones/delete.svg"), 40));
		}

		public override void PopulaGrid()
		{
			try
			{
				if (IsPostBack)
					return;

				DataTable dt = new DataTable();
				dt.Columns.Add(PRODUTO.ID);
				dt.Columns.Add(MARCA.DESCRICAO);
				dt.Columns.Add(PRODUTO.CATEGORIA_ID);
				dt.Columns.Add(PRODUTO.MODELO);
				dt.Columns.Add(PRODUTO.PRECO);
				dt.Columns.Add(FOTOS.ID);

				int numProdutos = 0;

				List<PersistenceLayer.Model.Produto> lp = new List<PersistenceLayer.Model.Produto>();
				ProdutoDAL pd = new ProdutoDAL();

				if (GetFilterType == FILTER_NORMAL)
					//lstProdutos = BProduto.GetProdutos((GetPagina - 1) * 16, 16, GetOrdenacao, GetFilter, out numProdutos);
					lp = pd.Listar((GetPagina - 1) * 16, 16, (int)GetOrdenacao, GetFilter, true, out numProdutos);
				else if (GetFilterType == FILTER_CODPROD)
					lp = pd.ListarPorCodigo((GetPagina - 1) * 16, 16, (int)GetOrdenacao, GetFilter, out numProdutos);

				if (lp == null)
					return;

				CarregaPaginacao(numProdutos);

				foreach (Produto p in lp)
				{
					dt.Rows.Add(p.ID, p.Produto_Marca.Descricao, p.Produto_Categoria.Descricao, p.Modelo,
						p.Preco.toMoneyString(), (p.Produto_Fotos == null ? 0 : p.Produto_Fotos.Count));
				}

				grdProdutos.DataSource = dt;
				grdProdutos.DataBind();
				grdProdutos.Columns[0].Visible = false;
			}
			catch (Exception)
			{
				throw;
			}
		}

		private void CarregaPaginacao(int numProdutos)
		{
			int numPaginas = Convert.ToInt32(numProdutos / 16);
			if (numProdutos % 16 > 0)
				numPaginas++;

			hdfNumeroPaginas.Value = numPaginas.ToString();

			if (GetPagina == 1)
			{
				btnPrimeira.Enabled = false;
				btnPagAnterior.Visible = false;
				btnVoltar.Enabled = false;
			}

			if (GetPagina == GetNumeroPaginas)
			{
				btnUltima.Enabled = false;
				btnUltima.CssClass = "PaginationDisabled";
				btnProxima.Enabled = false;
				btnProxima.CssClass = "PaginationDisabled";
				btnPagProxima.Visible = false;
			}

			lblPagAtual.Text = GetPagina.ToString();
			btnPagAnterior.Text = (GetPagina - 1).ToString();
			btnPagProxima.Text = (GetPagina + 1).ToString();
			btnUltima.Text = ">> Última (" + numPaginas + ")";

		}

		protected void btnPesquisar_Click(object sender, ImageClickEventArgs e)
		{
			try
			{
				switch (ddlPesquisarPor.SelectedItem.Text)
				{
					case "Todos os produtos":
					case "Marca":
					case "Categoria":
					case "Categoria Master":
					case "Modelo":
						base.RedirectProdutos(FILTER_NORMAL, GetPagina, txtPesquisar.Text, (int)GetOrdenacao);
						break;
					case "Código Produto":
						base.RedirectProdutos(FILTER_CODPROD, GetPagina, txtPesquisar.Text, (int)GetOrdenacao);
						break;
					default:
						break;
				}


			}
			catch (Exception ex)
			{
				lblErro.Text = ex.Message;
			}
		}

		protected void btnAddProduto_Click(object sender, EventArgs e)
		{
			Response.Redirect("InfoProduto.aspx?" + OUTROS.ACAO + "=" + (int)Acao.ADICIONAR);
		}

		protected void grdProdutos_RowCommand(object sender, GridViewCommandEventArgs e)
		{
			Int64 ID = Gridview.GetID(sender, e);

			switch (e.CommandName)
			{
				case "editar":
					Response.Redirect("InfoProduto.aspx?" + OUTROS.ACAO + "=" + (int)Acao.EDITAR + "&" + OUTROS.PRODUTO_ID + "=" + ID.ToString());
					break;
				case "deletar":
					break;
				default:
					break;
			}
		}

		protected void grdProdutos_RowDataBound(object sender, GridViewRowEventArgs e)
		{
			try
			{
				if (e.Row.RowType == DataControlRowType.DataRow)
				{
					Image imgEditar = (Image)e.Row.Cells[6].Controls[0];
					imgEditar.Height = 26;
					Image imgExcluir = (Image)e.Row.Cells[7].Controls[0];
					imgExcluir.Height = 30;

					var pd = new ProdutoDAL();
					Produto p = pd.Obter(Convert.ToInt64(e.Row.Cells[0].Text));

					if (p.Peso == 0)
						e.Row.ForeColor = System.Drawing.Color.Green;

					if ((p.Produto_Especificacao == null) || (p.Produto_Especificacao.Count == 0))
						e.Row.ForeColor = System.Drawing.Color.Red;

					if (p.Produto_Fotos.Count == 0)
						e.Row.ForeColor = System.Drawing.Color.Blue;
				}
			}
			catch (Exception)
			{
				throw;
			}
		}

		protected void btnPrimeira_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetFilterType, 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnVoltar_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetFilterType, GetPagina - 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnPagAnterior_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetFilterType, GetPagina - 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnPagProxima_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetFilterType, GetPagina + 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnProxima_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetFilterType, GetPagina + 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnUltima_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetFilterType, GetNumeroPaginas, GetFilter, (int)GetOrdenacao);
		}
	}
}